package br.com.wagnerfull.precoimovel.cadastro;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;

public class CorrecaoValor implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = -5618480074710856867L;

	private Long competencia;

	private Double valor;

	private List<Incc> tabelaIncc;

	public CorrecaoValor(Long competencia, Double valor, List<Incc> tabelaIncc) {
		this.competencia = competencia;
		this.valor = valor;
		this.tabelaIncc = tabelaIncc;
	}

	public Double executar() {
		return executar(0);
	}

	public Double executar(int quantCompetencias) {
		if (valor != null && competencia != null) {
			if (tabelaIncc != null && tabelaIncc.size() > 0) {
				BigDecimal somaDecimal = new BigDecimal(0);
				if (quantCompetencias > 0) {
					int count = 0;
					somaDecimal = somaDecimal.add(new BigDecimal(valor));
					while (count <= quantCompetencias) {
						Incc incc = tabelaIncc.get(count);
						Float indice = incc.getIndice();
						Double valorAtualizado = (valor * indice / 100);
						somaDecimal = somaDecimal.add(new BigDecimal(
								valorAtualizado));
						count++;
					}
				} else {
					for (Incc incc : tabelaIncc) {
						if (competencia.longValue() == incc.getCompetencia()
								.longValue()) {
							Float indiceAcumulado = getIndiceAcumulado(
									tabelaIncc, 12, competencia);
							Double valorAtualizado = valor * indiceAcumulado
									/ 100 + valor;
							somaDecimal = somaDecimal.add(new BigDecimal(
									valorAtualizado));
						}
					}
				}
				return somaDecimal.doubleValue();
			} else {
				return valor;
			}
		}
		return 0D;
	}

	private Float getIndiceAcumulado(List<Incc> tabelaIncc,
			int countCompetencia, Long cptInicio) {
		BigDecimal somaDecimal = new BigDecimal(0);
		int indiceCptInicio = -1;
		for (Incc incc : tabelaIncc) {
			if (incc.getCompetencia().equals(cptInicio)) {
				indiceCptInicio = tabelaIncc.indexOf(incc);
			}
		}

		if (indiceCptInicio < 0) {
			return 0F;
		}

		int passo = 1;

		while (passo <= countCompetencia) {
			Float indiceIncc = tabelaIncc.get(indiceCptInicio).getIndice();
			somaDecimal = somaDecimal.add(new BigDecimal(indiceIncc));
			indiceCptInicio++;
			passo++;
		}
		return Float.valueOf(somaDecimal.floatValue() / 10);
	}
}
